昨天跟前天的東西都超級多,今天來點輕鬆的
繼昨天的變數以及服務,我們要接著來看程式語言的另一項語法。
函式這項指令,你可以把他想成一台能把很複雜的工作簡單化的機器,舉例來說,當今天我們要在此物件被觸發了許多事件時執行同一項程式,那在每一次事件被觸發時都重新定義各項變數,以及各項指令、輸入與輸出,這樣的工序不僅非常繁瑣,並且也會非常消耗伺服器的資源,這時如果我們先將此項要執行的指令先全部定義在函式裡面,等到需要時再把函式叫出來,這樣既可以節省工序,在後續閱讀程式碼時也比較容易。
定義說完了,接下來來看實作:
關於事件的概念會在下個章節提到,這裡大家可以先不用理他
function myFunction()
print("Hello!") --欸嘿你還記得這是幹嘛的嗎?
end
script.Parent.Touched:Connect(myFunction) --這是"當物件被碰到時"會觸發的事件
script.Parent.Changed:Connect(myFunction) --這是"當物件的屬性改變時"會觸發的事件
在上述程式碼中,我們可以看到在第一行至第三行,我們使用function這項指令定義了一個函式,而函式的名稱叫做myFunction,至於後面的 () 就是拿來放參數的地方,所謂的參數,就是當事件觸發時,會給予函式的指定變數,這項變數可以是我們在昨天所提到的任何資料型態,至於第三行的end則是告知系統這項函式的定義到這裡結束。
而在第五、六行,我們將上述的函式透過Connect這項指令把函式連接到指定的事件,所以當事件被觸發時,函式就會被呼叫 (也就是函式就會執行它帶有的程式碼)
另外,在Lua語言中,-- 代表了註解,當一項指令碼或文字被註解時,我們在編輯時還是可以看到他們,不過程式在執行時就會自動忽略被註解的區域,而每一個程式語言在註解文字時的用法都不同,例如C++是 // 、Python是 # 等。
在前一章節的程式碼中,我們知道了可以將各項事件連接到函式,那所以什麼是事件呢? 事件就是當此物件被某項外力執行了指定的操作,進而導致觸發了某項屬性,以上述的程式碼舉例的話就相當於當今天這個物件被碰到時,觸發Touched函式,而在進入事件的規則之前,我們要先了解在昨天有稍稍提過的一項資料型態,也就是路徑,以平常日常生活中的例子而言,就如同我下載了一個圖片,我把它放到桌面這樣子的概念,這是什麼意思呢? 在你把圖片放到桌面的這個過程中,這張圖片身上帶有的屬性路徑也會跟著改變,假如你剛下載下來是圖片是放在下載資料夾,則該圖片的路徑就會是C:/下載,而當你把它移到桌面時,他的路徑也就進而改變成C:/桌面,而我們在Luau中是不用這麼麻煩啦,但道理是相同的。
在Luau中,有些特定的詞是你無法將它當成變數、函式名稱來命名的,這些字詞就是所謂的保留字,程式語言透過預先保留了這些字詞來讓我們在寫程式時可以更方便,而上述的路徑用法也有許多的保留字,以下就是各項保留字的介紹:
註: 你一定要把這章節看完
script 這個腳本
Parent 這個物件的上一個項目 (父項目)
. 的
嗯對路徑的保留字大概就這幾個,但他們都非常的重要,我們來看下面的例子:
script.Parent.CanCollide = false
很難懂對吧,如果我們直接用前面提到的保留字翻譯上面這串程式碼,其實就不難理解他在幹嘛了
這個腳本 的 上一個項目 的 CanCollide(欸這個昨天講過喔) = false
像這樣的翻譯過後,就可以瞭解到這串程式碼是在將這個腳本的上一個項目的是否可觸碰的變數值設為否。
好的,路徑講完了,回來講事件,事件你其實也是可以把他想成是一項屬性,只是你不能調整他,你只能夠在他處發時去做更多的動作,來舉個最簡單的例子,當今天一個物件被碰到的時候,他就會觸發一個Touched的事件,而連接事件的觸發與函式的指令就是Connect,透過使用Connect將函式與事件結合,就可以達到當某事件被處發,執行某項程式的行為
而事件與函式連接的寫法總共有三種,來看下面的程式碼
這是第一種
local Part = script.Parent
function onTouched(Hit)
print(Hit.Name)
end
Part.Touched:Connect(onTouched)
這是第二種
local Part = script.Parent
Part.Touched:Connect(function(Hit)
print(Hit.Name)
end)
這是第三種
local Part = script.Parent
local Connection = Part.Touched:Connect(function(Hit)
print(Hit.Name)
end)
第一種是先定義函式,再連接,第二種是在事件被觸發的同時定義函式並連接,第三種則是在事件被觸發時,先將被觸發的事件儲存到一項變數裡,然後再定義函式並連接
通常第一種寫法的使用情境會是我有多個被觸發的事件,但他們要執行的函式都一樣,第二種的使用情境會是我只有這個事件會使用到這個函式,於是我乾脆就別浪費時間多定義一次,而第三種的使用情境式我只有這個事件會使用到這個函式,並且我可能會在某項判斷式或另一個事件觸發時去斷開這項連接。
而關於斷開函式連接的用法如下
local Connection = Part.Touched:Connect(function(Hit)
print(Hit.Name)
end)
Connection:Disconnect()
可以看到,我們在第五行用了Luau語言裡的內建函式將上述的事件與函式斷開,所謂的內建函式,就是你不需要定義,程式在你運行之前就會預先自己定義好的函式,所以你可以直接拿來用,像上面的例子就是Disconnect。
而每一項物件都有自己不同的事件可以觸發,這些事件我們會在之後的幾天裡不斷地看到,我也會逐步講解這個事件的觸發方法以及會傳入的參數,那大家就看到一個學一個吧!
明天會開始講解判斷邏輯與調整顏色的Color3函式的用法